package com.grammar2.G02_abstract;

/**
 *  抽象方法：就是加上abstract关键字，然后去掉大括号，直接分好结束。
 *  抽象类：抽象方法所在的类，必须是抽象类才行。在class之前写上abstract即可。
 *
 *  如何使用抽象类和抽象方法:
 *      1.不能直接创建new抽象对象。
 *      2.必须用一个子类来继承抽象父类。
 *      3.子类必须覆盖重写抽象父类当中的所有抽象方法。
 *          覆盖重写（也叫实现）:子类去掉抽象方法的abstract关键字，然后补上方法体大括号。
 *      4.创建子类对象进行使用。
 *
 *  注意事项：
 *      1.抽象类不能创建对象，如果创建，编译无法通过而报错。只能创建其非抽象子类的对象。
 *          理解：假设创建了抽象类的对象，调用抽象方法，而抽象方法没有具体的方法体，没有意义。
 *
 *      2.抽象类中，可以有构造方法，是供子类创建对象时，初始化父类成员使用的。
 *          理解：子类的构造方法中，有默认的super()，需要访问父类构造方法。
 *
 *      3.抽象类中，不一定包含抽象方法，但是有抽象方法的类必定是抽象类。
 *          理解：未包含抽象方法的抽象类，目的即是不想让调用者创建该类对象，通常用于某些特殊的类结果设计。
 *
 *      4.抽象类的子类，必须重写抽象父类中所有的抽象方法，否则编译无法通过而报错。除非该子类也是抽象类。
 *          理解：假设不重写所有的抽象方法，则类中可能包含抽象方法。那么创建对象后，调用抽象的方法，没有意义。
 */
public abstract class Demo01_abstract_animal {
    //定义抽象方法
    public abstract void eat();

    public void speak(){
        System.out.println("我也可以直接在抽象类中定义普通的方法");
    }
}
